package com.cn.wanxi.service.impl;

import com.cn.wanxi.dao.CompanyDao;
import com.cn.wanxi.model.CompanyModel;
import com.cn.wanxi.service.CompanyService;
import com.cn.wanxi.util.PathTool;

// File是Java自带的类  对象 jdk (这里面存在Java最基础的类，通用的类)
import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * 数据需要从文件里面来？
 * 1.创建文件----
 * 2.将数据存放到文件
 * 3.读取文件内容
 * 4.需要将读取的内容封装成Java对象
 * -------------------------------------------------
 * 如果一个方法里面写了很多代码 做了很多不同的事情，则代码冗余，代码不规范
 * 一个方法里面只做一件事情，（各司其职）
 */
public class CompanyServiceImpl implements CompanyService {
    @Override
    public CompanyModel getCompanyModel() {
//        1.创建文件
        File file = createFile();
//        File file=null;
//        String[] data = {"fasdkhfakjsdhfas", "fasdkhfakjsdhfas"};
//        2 封装dao层数据，用于写入记事本
        String[] data = getData();
//        3.将数据存放到文件
        saveFile(file, data);
//        4.读取文件内容
        String s = readFile(file);
//        5.需要将读取的内容封装成Java对象
        return setData(s);


    }

    /**
     * 封装dao成的数据，用于写入记事本文件
     *
     * @return
     */
    private String[] getData() {
        CompanyDao companyDao = new CompanyDao();
        String[] data = {companyDao.logo, companyDao.phone, companyDao.net, companyDao.email, companyDao.linePhone, companyDao.address, companyDao.version};
        return data;
    }

    /**
     * 通过读取的数据，封装成CompanyModel
     *
     * @param s
     * @return
     */
    private CompanyModel setData(String s) {
        CompanyModel companyModel = new CompanyModel();
//        CompanyDao companyDao = new CompanyDao();
//        需要将s里面的内容转换为CompanyModel里面的属性值
//        所以我们可以通过每一个换行的符号，将结果解析成单独的字符串
//        将字符串解析成无数个字符串(数组)？
        String[] split = s.split(PathTool.ENTER);
//        for (int i = 0; i < split.length; i++) {
//            System.out.println(split[i] + "------" + i);
//        }
        companyModel.setLogo(split[0]);
        companyModel.setPhone(split[1]);
        companyModel.setNet(split[2]);
        companyModel.setEmail(split[3]);
        companyModel.setLinePhone(split[4]);
        companyModel.setAddress(split[5]);
        companyModel.setVersion(split[6]);
        return companyModel;
    }

    /**
     * 读取文件数据
     * 应该属于输入流
     *
     * @param file
     */
    private String readFile(File file) {

        try {
//            InputStream inputStream = new FileInputStream(file);
            InputStream is = new FileInputStream(file);
//            InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
            Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8);
//            Reader reader1=new FileReader(file);
//            byte[] bytes = new byte[1000];
//分片读取或者下载数据
//            int many = 1024 * 1024 * 1024;
//            for (int i = 0; i < file.length()/many; i = i + 1000) {
////                线程：加入视频有10个G，则分层十个线程下载，每个线程下载1个G，
//                inputStream.read(bytes, i * many, many);
//            }
            int read = 0;// 读取的字节
//            long length=file.length();
//            for (int i = 0; i < length; i++) {
//                read=inputStream.read();
//                System.out.print((char)read);
//            }
//            String和StringBuilder和StringBuffer的区别？
//            以后只要是字符串拼接，不要用String；
            StringBuilder result = new StringBuilder();
            while ((read = reader.read()) != -1) {
//                System.out.print((char) read);
                result.append((char) read);//重载
            }
            return result.toString();
//            System.out.println(result);
//            所有的字符全部在一起，所以需要一个字符数组，哪个容器是由字符串数组来的？
//            既然String默认就是一个静态的数组，则我们直接用String来接收字符


        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    private String read(File file) {
        try {
            InputStream is = new FileInputStream(file);
            Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8);
            StringBuilder result = new StringBuilder();
            int read = 0;
            while ((read = reader.read()) != -1) {

                result.append((char) read);//重载
            }
            return result.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;

    }

    /**
     * 存放数据
     * 1.存放到哪里？需要文件
     * 2.数据在哪里？需要数据
     * 将dao层的数据放入文件里面？
     * 内存 ---》硬盘   输出流
     * OutputStream 是一个抽象类 抽象类不能被实例化
     * 不能创建对象，只能通过子类取实现或者继承并创建对象
     * 请列举10个常见异常？
     * FileNotFoundException......
     * IOException
     * NumberFormatException
     * Object里面有哪些常用的方法？
     * 1.getClass   得到当前的对象 （反射）
     * 2.hashcode   得到hashcode嘛
     * 3.equals     判断 两边的对象是否相等
     * 4.clone      克隆 （深克隆，浅克隆）
     * 5.wait       线程等待    notify  线程唤醒
     * 6. finalize    垃圾回收
     * 7.toString     将对象转换为字符串
     * 8.registerNatives
     * -----------------------------------------
     * length属性  length()方法
     * 字符串有没有length属性？length方法？
     * 数组有没有length属性？length方法？
     * 集合有没有length属性？length方法？
     * 如果 汉字以gbk的编码则为2个字节 utf-8  三个字节
     *
     * @param file
     * @param data
     */
    private void saveFile(File file, String[] data) {
        try {
//            所有的应用类型的父类都是Object
            OutputStream outputStream = new FileOutputStream(file);
//int i=33;
//char c= (char) i;‘c’
//            System.out.println(c);
//            中文字符占多少个字节？
//            char c='过';
//            String s="中";
//            s.length();
//            Character cc=c;
//            System.out.println(cc.toString().getBytes().length);
//            outputStream.write();
//            有可能找不到文件
//            String  aa="过";
//            int bb= Integer.parseInt(aa);
//            System.out.println(bb);
//            怎么将字符转换为byte数组？
//            outputStream.write(data[0].getBytes());
//            outputStream.write(data[1].getBytes());
//            fori和forEach是一样
            for (String datum : data) {
//                如果方法里面有字符，固定常量，则不能出现在方法里面，必须提取出去
                outputStream.write(datum.getBytes(StandardCharsets.UTF_8));
                outputStream.write(PathTool.ENTER.getBytes());
            }
//            for (int i = 0; i <data.length ; i++) {
//            CompanyDao companyDao = new CompanyDao();
//            outputStream.write(companyDao.logo.getBytes(StandardCharsets.UTF_8));
//            outputStream.write(PathTool.ENTER.getBytes());
//            outputStream.write(companyDao.phone.getBytes(StandardCharsets.UTF_8));
//            outputStream.write(PathTool.ENTER.getBytes());
//            outputStream.write(companyDao.net.getBytes(StandardCharsets.UTF_8));
//            outputStream.write(PathTool.ENTER.getBytes());
//            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 写注释：
     * 创建文件用于存放数据
     */
    private File createFile() {
//        如果构造方法里面有参数，则默认的无参数的构造方法失效

        File filePathName = new File(PathTool.PATH);//得到文件夹的路径
// 需要创建一个文件夹，定义一个新的文件夹的路径

//        将两个文件路径之间自动加斜杠
        File fileFolder = new File(filePathName, PathTool.FOLDER);
//        System.out.println(fileFolder);
//        创建文件夹,mkdirs和mkdir的区别？
        boolean mkdir = fileFolder.mkdirs();
//        System.out.println(mkdir);
//        创建文件夹需要地址：地址分为两部分：1.绝对地址  2.相对地址
//        创建文件：需要文件名

        File file = new File(fileFolder, PathTool.FILE_NAME);
        try {
            if (file.exists()) {
                file.delete();
            }
            boolean newFile = file.createNewFile();
            System.out.println(newFile);

        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

    public static void main(String[] args) {
        new CompanyServiceImpl().getCompanyModel();
    }
}
